home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / games / spassion / source.lzh / SOURCE / FuncEnemy / DRAGON.C < prev    next >
Text File  |  2000-03-20  |  6KB  |  258 lines

  1. /*
  2. #include <stdio.h>
  3. #include <iocslib.h>
  4. void    key_wait( void );
  5. #define BIT(i)        (1<<(i))
  6. */
  7. /* ドラゴン */
  8. /* 頭は画面上を動き回り、身体は後を付いていく。 */
  9. /* 右上から左上、左下、右上、消える */
  10. #include <xsp2lib.h>
  11. #include "../SPASSION.H"
  12. #include "../player.h"
  13. #include "../enemy.h"
  14. #include "../eshot.h"
  15. #include "../effect.h"
  16. #include "../priority.h"
  17. #include "../sound.h"
  18. #include "../entry.h"
  19. #ifndef NULL
  20. #define NULL ((void *) 0)
  21. #endif
  22.  
  23. #define PALET_MAIN    0x0700
  24. #define R            12
  25.  
  26. static short MoveEnemyDragonHead(ENEMY *);
  27. /*static void TiniEnemyDragonHead(ENEMY *);*/
  28. static short MoveEnemyDragonBody(ENEMY *);
  29. static short pointer=0,flg=0;
  30. static int body_x[256],body_y[256];
  31. static HIT_XY4    hit_p[32]={
  32.     - 8,-16, 8,12,
  33.     - 8,-10, 8, 8,
  34.     - 8,-10, 8, 8,
  35.     - 8,-10, 8, 8,
  36.     - 8,-10, 8, 8,
  37.     - 8,-10, 8, 8,
  38.     - 8,-10, 8, 8,
  39.     -12,-10,15, 8,
  40.  
  41.     -12,- 8,15,10,
  42.     - 8,- 8, 8,10,
  43.     - 8,- 8, 8,10,
  44.     - 8,- 8, 8,10,
  45.     - 8,- 8, 8,10,
  46.     - 8,- 8, 8,10,
  47.     - 8,- 8, 8,10,
  48.     - 8,-12, 8,16,
  49.  
  50.     - 8,-12, 8,16,
  51.     - 8,- 8, 8,10,
  52.     - 8,- 8, 8,10,
  53.     - 8,- 8, 8,10,
  54.     - 8,- 8, 8,10,
  55.     - 8,- 8, 8,10,
  56.     - 8,- 8, 8,10,
  57.     -15,- 8,12,10,
  58.  
  59.     -15,-10,12, 8,
  60.     - 8,-10, 8, 8,
  61.     - 8,-10, 8, 8,
  62.     - 8,-10, 8, 8,
  63.     - 8,-10, 8, 8,
  64.     - 8,-10, 8, 8,
  65.     - 8,-10, 8, 8,
  66.     - 8,-16, 8,12,
  67. };
  68. static HIT_XY4    hit_s[32];
  69.  
  70. static HIT_XY4    hit_body_p[]={-10,-10,10,10};
  71. static HIT_XY4    hit_body_s[]={- 8,- 8, 8, 8};
  72. extern HIT_XY4    nohit;
  73.  
  74. void InitEnemyDragonHeadHit( void )
  75. {
  76.     short    i;
  77.     for(i=0;i<32;i++){
  78.         hit_s[i].x1=hit_p[i].x1             ;hit_s[i].y1=hit_p[i].y1             ;
  79.         hit_s[i].x2=hit_p[i].x2             ;hit_s[i].y2=hit_p[i].y2             ;
  80.         hit_p[i].x1=hit_p[i].x1-PLAYER_HIT_X;hit_p[i].y1=hit_p[i].y1-PLAYER_HIT_Y;
  81.         hit_p[i].x2=hit_p[i].x2+PLAYER_HIT_X;hit_p[i].y2=hit_p[i].y2+PLAYER_HIT_Y;
  82.     }
  83. }
  84. void InitEnemyDragonBodyHit( void )
  85. {
  86.     hit_body_p[0].x1-=PLAYER_HIT_X;hit_body_p[0].y1-=PLAYER_HIT_Y;
  87.     hit_body_p[0].x2+=PLAYER_HIT_X;hit_body_p[0].y2+=PLAYER_HIT_Y;
  88. }
  89.  
  90. void InitEnemyDragonHead(ENEMY *ene)
  91. {
  92.     short    i;
  93.     ene->lx             = (255+64) * 65536;        /* 右上から出てくるのが前提 */
  94.     ene->ly             =       64 * 65536;
  95.     ene->vx             = -2 * 65536;
  96.     ene->vy             = 0;
  97.     ene->hit_p[0]     = &hit_p[0];ene->hit_p[1]=NULL;
  98.     ene->hit_o[0]     = &nohit   ;ene->hit_o[1]=NULL;
  99.     ene->hit_s[0]     = &hit_s[0];ene->hit_s[1]=NULL;
  100.     ene->hp             = 200;
  101.     ene->angle         = 160;
  102.     ene->pt             = obj_dragon + 128 + ((ene->angle) >> 3);
  103.     ene->info         = PALET_MAIN | PRIORITY_BOSS-1;
  104.     ene->flg = flg = 0;
  105.     ene->no_dead     = 0;
  106.     ene->func_enemy_move = MoveEnemyDragonHead;
  107. /*    ene->func_enemy_tini = TiniEnemyDragonHead;*/
  108.     MakeEnemy(ENEMY_DRAGON_BODY, ene->lx>>16, ene->ly>>16,ene->arg,  ene);    /*ene->argの数だけ身体を出す*/
  109.     for(i=0;i<256;i++){
  110.         body_x[i]=ene->lx;
  111.         body_y[i]=ene->ly;
  112.     }
  113. /*    entry_counter_stop = !0;*/        /* エントリーカウンター停止 */
  114. }
  115. void InitEnemyDragonBody(ENEMY *ene)
  116. {
  117.     ene->hit_p[0]     = &hit_body_p[0];ene->hit_p[1]=NULL;
  118.     ene->hit_o[0]     = &nohit        ;ene->hit_o[1]=NULL;
  119.     ene->hit_s[0]     = &hit_body_s[0];ene->hit_s[1]=NULL;
  120.     ene->hp             = 200;
  121.     ene->pt             = obj_dragon+162;
  122.     ene->info         = PALET_MAIN | PRIORITY_BOSS-2;
  123.     ene->angle         = 160;
  124.     ene->flg         = (++flg);
  125.     ene->no_dead     = 0;
  126.     ene->func_enemy_move = MoveEnemyDragonBody;
  127. /*    ene->func_enemy_tini = TiniEnemyDragonBody;*/
  128.     ene->arg--;
  129.     if( ene->arg )
  130.         MakeEnemy(ENEMY_DRAGON_BODY, ene->lx>>16, ene->ly>>16,ene->arg,  ene);
  131.  
  132.     if( ene->arg<5 ){
  133.         ene->pt++;
  134.         if( ene->arg<2 )
  135.             ene->pt++;
  136.     }
  137. }
  138.  
  139.  
  140. /* ドラゴンの頭の動き */
  141. static short MoveEnemyDragonHead( ENEMY *ene )
  142. {
  143.     short    pt_num;
  144.  
  145.     if( ene->child_death ){
  146.         if( !ene->arg )
  147.             return (0);        /* 消去 */
  148.         pointer++;
  149.         pointer&=255;
  150.         body_x[pointer]=ene->lx;
  151.         body_y[pointer]=ene->ly;
  152.         return 1;
  153.     }
  154.  
  155.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  156.     ene->x = (ene->lx += ene->vx) >> 16;
  157.     ene->y = (ene->ly += ene->vy) >> 16;
  158.  
  159.     pointer++;
  160.     pointer&=255;
  161.     body_x[pointer]=ene->lx;
  162.     body_y[pointer]=ene->ly;
  163.  
  164.     switch (ene->state){
  165.     case 0:            /* 左上隅へ */
  166.         if(ene->angle>192+32)
  167.             ene->flg=1;
  168.         else if(ene->angle<192-32)
  169.             ene->flg=0;
  170.         if( ene->flg )
  171.             ene->angle-=2;
  172.         else
  173.             ene->angle+=2;
  174.         ene->vy=vy_tbl[13][ene->angle];
  175.         /* 斜めに折り返す */
  176.         if( ENE_X < 64 )
  177.             ene->state++;
  178.         break;
  179.     case 1:            /* 反時計周りに回転 */
  180.         ene->angle=(ene->angle-2)&255;
  181.         ene->vx=vx_tbl[R][ene->angle];
  182.         ene->vy=vy_tbl[R][ene->angle];
  183.         if( ene->count++ > 144 ){
  184.             ene->count=0;
  185.             ene->state++;
  186.         }
  187.         break;
  188.     case 2:            /* 左下まで移動 */
  189.         /* 斜めに折り返す */
  190.         if( ENE_Y > 192 ){
  191.             ene->state++;
  192.         }
  193.         break;
  194.     case 3:            /* 回転 */
  195.         ene->angle=(ene->angle-2)&255;
  196.         ene->vx=vx_tbl[R][ene->angle];
  197.         ene->vy=vy_tbl[R][ene->angle];
  198.         if( ene->count++ > 184 ){
  199.             ene->count=0;
  200.             ene->state++;
  201.         }
  202.         break;
  203.     case 4:            /* 右上へ */
  204.         /* 斜めに折り返す */
  205.         if( ENE_Y < 64 )
  206.             ene->state++;
  207.         break;
  208.     case 5:            /*右下へ*/
  209.         ene->angle=(ene->angle-2)&255;
  210.         ene->vx=vx_tbl[R][ene->angle];
  211.         ene->vy=vy_tbl[R][ene->angle];
  212.         if( ene->count++ > 220 )
  213.             ene->state++;
  214.         break;
  215.     case 6:            /*右下へ*/
  216.         if( ene->y > 120+16 ){
  217.             ene->child_death=1;
  218.             ene->hit_p[0]=NULL;
  219.         }
  220.     }
  221.     ene->pt = obj_dragon + 128 + (pt_num=(ene->angle >> 3));
  222.     ene->hit_p[0] = &hit_p[pt_num];
  223.  
  224.     if(ene->damage)ene->damage = 0;
  225.  
  226.     xobj_set_st(ene);
  227.     return(1);
  228. }
  229.  
  230. /* ドラゴンの身体 */
  231. static short MoveEnemyDragonBody( ENEMY *ene )
  232. {
  233.     if( ene->child_death ){
  234.         if( !ene->arg ){
  235.             ene->parent->arg=0;
  236.             return (0);        /* 消去 */
  237.         }
  238.         return(1);
  239.     }
  240.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  241.     ene->x = (ene->lx=body_x[pointer-ene->parent->flg*8 & 255]) >> 16;
  242.     ene->y = (ene->ly=body_y[pointer-ene->parent->flg*8 & 255]) >> 16;
  243.     xobj_set_st(ene);
  244.  
  245.     if( ene->parent->child_death && ene->y > 120+16 ){
  246.         ene->child_death = 1;
  247.         ene->hit_p[0]=NULL;
  248.     }
  249.  
  250.     return 1;
  251. }
  252.  
  253. /*
  254. static void TiniEnemyDragonHead(ENEMY * p)
  255. {
  256. }
  257. */
  258.